﻿using System;
using System.Runtime.InteropServices;

using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Web.UI.WebControls;
using System.IO;
using System.Web.UI.HtmlControls;

namespace Bartomolina.SharePoint.SPBM.OneStepImage
{
    [CLSCompliant(false)]
    [Guid("93c3d733-d44a-417b-a637-025e7377c3a1")]
    public class OneStepImageFieldControl : BaseFieldControl
    {
        private FileUpload fuImagen;
        private HtmlImage imagePreview;

        protected override void CreateChildControls()
        {
            if (this.Field != null && this.ControlMode != SPControlMode.Display)
            {
                base.CreateChildControls();

                fuImagen = new FileUpload();
                HtmlGenericControl br = new HtmlGenericControl("br");
                imagePreview = new HtmlImage();

                this.Controls.Add(fuImagen);

                if (this.ListItemFieldValue != null)
                {
                    this.Controls.Add(br);
                    this.Controls.Add(imagePreview);
                }
            }
        }

        /// <summary>
        /// Almacenamos la imagen en la biblioteca y guardamos la referencia a ella en el campo
        /// </summary>
        public override object Value
        {
            get
            {
                EnsureChildControls();

                if (!fuImagen.HasFile)
                    return this.ItemFieldValue;

                SPList listaImagenes;

                //obtenemos la ruta de las imágenes de la propiedad del campo y realizamos una mínima comprobación
                string rutaImagenes = Field.GetCustomProperty("LibraryURL").ToString();
                if (!rutaImagenes.StartsWith("/") && !rutaImagenes.StartsWith("http://"))
                    rutaImagenes = "/" + rutaImagenes;
                if (!rutaImagenes.EndsWith("/"))
                    rutaImagenes += "/";

                listaImagenes = SPContext.Current.Web.GetList(rutaImagenes);

                //cargamos la imagen
                Stream streamImagen = fuImagen.PostedFile.InputStream;
                byte[] bytesImagen = new byte[streamImagen.Length];

                streamImagen.Read(bytesImagen, 0, (int)streamImagen.Length);
                streamImagen.Close();

                //calculamos el nombre del fichero, comprobando si ya existe en la biblioteca
                string nombreFichero = OneStepImageUtil.ObtenerNombreFichero(fuImagen.FileName, listaImagenes.RootFolder);

                //añadimos la imagen a la biblioteca
                listaImagenes.RootFolder.Files.Add(nombreFichero, bytesImagen);

                //calculamos la ruta absoluta de la imagen final
                string rutaImagen = rutaImagenes + nombreFichero;

                return rutaImagen;
            }

            set
            {
                EnsureChildControls();

                imagePreview.Src = (string)value;
            }
        }
    }
}
